#include "chartview.h"
#include <QtGui/QMouseEvent>

ChartView::ChartView(QChart *chart, QWidget *parent) :
    QChartView(chart, parent),
    m_isTouching(false)
{
    setRubberBand(QChartView::RectangleRubberBand); // 设置了选框样式为矩形选框（RectangleRubberBand）。
}

bool ChartView::viewportEvent(QEvent *event)
{
    if (event->type() == QEvent::TouchBegin) {
        // 默认情况下的触摸事件会被转换为鼠标事件。所以在这个事件之后，我们也会得到一个鼠标事件，但我们想
        // 处理触摸事件只作为手势。所以我们需要这种保护措施来阻止实际上是由触摸产生的鼠标事件。
        m_isTouching = true;

        // 在处理手势时关闭动画，它们只会让我们慢下来。
        chart()->setAnimationOptions(QChart::NoAnimation);
    }
    return QChartView::viewportEvent(event);
}

void ChartView::mousePressEvent(QMouseEvent *event)
{
    if (m_isTouching)
        return;
    QChartView::mousePressEvent(event);
}

void ChartView::mouseMoveEvent(QMouseEvent *event)
{
    if (m_isTouching)
        return;
    QChartView::mouseMoveEvent(event);
}

void ChartView::mouseReleaseEvent(QMouseEvent *event)
{
    if (m_isTouching)
        m_isTouching = false;

    // 这是因为在检测到触摸事件时，之前可能禁用了图表的动画效果，现在需要重新启用它们。
    chart()->setAnimationOptions(QChart::SeriesAnimations);

    QChartView::mouseReleaseEvent(event);
}

//![按键按压事件]
void ChartView::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_Plus: // +键
        chart()->zoomIn();
        break;
    case Qt::Key_Minus: // -键
        chart()->zoomOut();
        break;
    case Qt::Key_Left:  // ->左箭头 按dx和dy指定的距离滚动图表的可见区域。对于极坐标图，dx表示沿角轴的角度，而不是表示距离。
        chart()->scroll(-10, 0);
        break;
    case Qt::Key_Right:
        chart()->scroll(10, 0);
        break;
    case Qt::Key_Up:
        chart()->scroll(0, 10);
        break;
    case Qt::Key_Down:
        chart()->scroll(0, -10);
        break;
    default: // 如果按下的是其他键，调用父类QGraphicsView的keyPressEvent()函数处理键盘事件。
        QGraphicsView::keyPressEvent(event);
        break;
    }
}
